package com.xzz;

import java.math.BigDecimal;
import java.util.LinkedList;
import java.util.Queue;

/**
 * 学校的自助午餐提供圆形和方形的三明治，分别用数字0和1表示。所有学生站在一个队列里，每个学生要么喜欢圆形的要么喜欢方形的。
 * 餐厅里三明治的数量与学生的数量相同。所有三明治都放在一个栈里，每一轮：
 *
 * 如果队列最前面的学生喜欢栈顶的三明治，那么会拿走它并离开队列。
 * 否则，这名学生会放弃这个三明治并回到队列的尾部。
 * 这个过程会一直持续到队列里所有学生都不喜欢栈顶的三明治为止。
 *
 *
 * 输入：students = [1,1,0,0], sandwiches = [0,1,0,1]
 * 输出：0
 * 解释：
 * - 最前面的学生放弃最顶上的三明治，并回到队列的末尾，学生队列变为 students = [1,0,0,1]。
 * - 最前面的学生放弃最顶上的三明治，并回到队列的末尾，学生队列变为 students = [0,0,1,1]。
 * - 最前面的学生拿走最顶上的三明治，剩余学生队列为 students = [0,1,1]，三明治栈为 sandwiches = [1,0,1]。
 * - 最前面的学生放弃最顶上的三明治，并回到队列的末尾，学生队列变为 students = [1,1,0]。
 * - 最前面的学生拿走最顶上的三明治，剩余学生队列为 students = [1,0]，三明治栈为 sandwiches = [0,1]。
 * - 最前面的学生放弃最顶上的三明治，并回到队列的末尾，学生队列变为 students = [0,1]。
 * - 最前面的学生拿走最顶上的三明治，剩余学生队列为 students = [1]，三明治栈为 sandwiches = [1]。
 * - 最前面的学生拿走最顶上的三明治，剩余学生队列为 students = []，三明治栈为 sandwiches = []。
 * 所以所有学生都有三明治吃。
 *
 */
public class CountStudents {

    public static int countStudents(int[] students, int[] sandwiches) {
        if (students == null || students.length == 0) return 0;
        if (sandwiches == null || sandwiches.length == 0) return students.length;
        //  因为涉及到学生从队头移动到队尾，使用队列
        Queue<Integer> stu = new LinkedList<>();
        for (int student : students) {
            stu.offer(student);
        }
        for (int i = 0; i < sandwiches.length; i++) {
            // 队列为空，说明所有学生都满足了
            if (stu.isEmpty()) {
                return 0;
            }
            // 记录学生队列的长度，防止学生无限制转圈下去
            int size = stu.size();
            boolean like = false;
            for (int s = 0; s < size; s++) {
                int poll = stu.poll();
                if (poll != sandwiches[i]) {
                    // 学生移动到队尾
                    stu.offer(poll);
                } else {
                    // 顶层的三明治有人喜欢，停止遍历，继续判断下一块三明治（这跟拍卖似的^_^）
                    like = true;
                    break;
                }
            }
            if (!like) {
                // 顶层的三明治没有人喜欢，结束，返回不能满足的学生数
                return size;
            }
        }
        return stu.size();

    }

    public static void main(String[] args) {
        System.out.println(0==BigDecimal.valueOf(0).intValue());
        System.out.println(BigDecimal.ZERO.compareTo(new BigDecimal(0.0000)));
        System.out.println(countStudents(new int[]{1,1,0,0},new int[]{0,1,0,1}));
        System.out.println(countStudents(new int[]{1,1,1,0,0,1},new int[]{1,0,0,0,1,1}));
    }
}
